// 1 实例化
// 2 请求拦截器 响应拦截器
// 3 封装一个单独的函数(一般会这么做)

import axios from 'axios'
import store from '@/store'

// 实例化
const instance = axios.create({
  // 基地址
  baseURL: 'http://pcapi-xiaotuxian-front-devtest.itheima.net/',
  // 超时限制
  timeout: 5000
})

// 请求拦截器
instance.interceptors.request.use(config => {
  // 注入token
  const token = store.state.user.profile.token
  // 请求header中添加
  if (token) {
    config.headers.Authorization = `Bearer ${token}`
  }
  return config
}, e => Promise.reject(e))

// 响应拦截器
// 1 token失效 跳回登录页
// 2 简化数据获取 response.data 当后端不是以200-300当成成功的标识
// 而是一个自定义字段，需要前端手动抛出错误
instance.interceptors.response.use(
  // http状态 200-300 表示响应成功
  (response) => {
    // const { success, message } = response.data
    // if (success) {
    //   return response.data
    // } else {
    //   return Promise.reject(message)
    // }
    return response.data
  },
  // 不在 200 - 300 表示响应失败
  (error) => {
    return Promise.reject(error)
  }
)

// 封装一个函数
// 为了api模块服务 方便使用接口函数的时候 可以不管当前是get请求还是post请求 统一参数传入

// 默认导出
export default function createAPI (url, method, reqData) {
  // 注意return 没有return 默认是undefined
  return instance({
    url, // 请求地址
    method, // 请求方法 get/post
    // 根据传入的method做判断 get 或者 post请求 适配key
    // .toLowerCase()全转小写 防止传的get不标准
    [method.toLowerCase() === 'get' ? 'params' : 'data']: reqData // 请求参数 必须是一个对象
  })
}
// createAPI('url', 'get', data).then(res => {})
